Elixir (programming language)
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
top
Elixir is a functional, concurrent, high-level general-purpose programming language that runs on the BEAM virtual machine, which is also used to implement the Erlang programming language.cite-ref-0-3-0[3] Elixir builds on top of Erlang and shares the same abstractions for building distributed, fault-tolerant applications. Elixir also provides tooling and an extensible design. The latter is supported by compile-time metaprogramming with macros and polymorphism via protocols.cite-ref-4[4]
Contents
β’ History
β’ Versioning
β’ Features
β’ Examples
β’ See also
β’ References
β’ Further reading
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
History
JosΓ© Valim created the Elixir programming language as a research and development project at Plataformatec. His goals were to enable higher extensibility and productivity in the Erlang VM while maintaining compatibility with Erlang's ecosystem.cite-ref-10[10]cite-ref-11[11]
In 2021, the Numerical Elixir effort was announced with the goal of bringing machine learning, neural networks, GPU compilation, data processing, and computational notebooks to the Elixir ecosystem.cite-ref-13[13]
Versioning
Features
β’ Scalability and fault-tolerance, thanks to Erlang's lightweight concurrency mechanismscite-ref-elixirhome-15-1[15]
β’ Built-in tooling for managing dependencies, code compilation, running tests, formatting code, remote debugging and more.
β’ Everything is an expressioncite-ref-elixirhome-15-2[15]
β’ Type hints for static analysis tools
β’ Immutable data, with an emphasis, like other functional languages, on recursion and higher-order functions instead of side-effect-based looping
β’ Lazy and async collections with streams
β’ Railway oriented programming via the with constructcite-ref-18[18]
β’ Hygienic metaprogramming by direct access to the abstract syntax tree (AST).cite-ref-elixirhome-15-4[15] Libraries often implement small domain-specific languages, such as for databases or testing.
β’ Code execution at compile time. The Elixir compiler also runs on the BEAM, so modules that are being compiled can immediately run code which has already been compiled.
β’ Polymorphism via a mechanism called protocols. Dynamic dispatch, as in Clojure, however, without multiple dispatch because Elixir protocols dispatch on a single type.
Examples
The following examples can be run in an iex shell or saved in a file and run from the command line by typing elixir <filename>.
Classic Hello world example:
iex> IO.puts("Hello World!")
Hello World!
Pipe operator:
iex> "Elixir" |> String.graphemes() |> Enum.frequencies()
%{"E" => 1, "i" => 2, "l" => 1, "r" => 1, "x" => 1}
iex> %{values: 1..5} |> Map.get(:values) |> Enum.map(& &1 * 2)
[2, 4, 6, 8, 10]
iex> %{values: 1..5} |> Map.get(:values) |> Enum.map(& &1 * 2) |> Enum.sum()
30
Pattern matching (a.k.a. destructuring):
iex> %{left: x} = %{left: 5, right: 8}
iex> x
5
iex> {:ok, [_ | rest]} = {:ok, [1, 2, 3]}
iex> rest
[2, 3]
Pattern matching with multiple clauses:
iex> case File.read("path/to/file") do
iex> {:ok, contents} -> IO.puts("found file: #{contents}")
iex> {:error, reason} -> IO.puts("missing file: #{reason}")
iex> end
iex> for n <- 1..5, rem(n, 2) == 1, do: n*n
[1, 9, 25]
Asynchronously reading files with streams:
1..5
|> Task.async_stream(&File.read!("#{&1}.txt"))
|> Stream.filter(fn {:ok, contents} -> String.trim(contents) != "" end)
|> Enum.join("\n")
Multiple function bodies with guards:
def fib(n) when n in [0, 1], do: n
def fib(n), do: fib(n-2) + fib(n-1)
Relational databases with the Ecto library:
schema "weather" do
field :city # Defaults to type :string
field :temp_lo, :integer
field :temp_hi, :integer
field :prcp, :float, default: 0.0
end
Weather |> where(city: "KrakΓ³w") |> order_by(:temp_lo) |> limit(10) |> Repo.all
Sequentially spawning a thousand processes:
for num <- 1..1000, do: spawn fn -> IO.puts("#{num * 2}") end
Asynchronously performing a task:
task = Task.async fn -> perform_complex_action() end
other_time_consuming_action()
Task.await task
See also
References
cite-note-wikidata-38d73dbc67fe379aec44b4c951a0b1d72113a0cd-v20-11. "Release 1.18.4". 21 May 2025. Retrieved 25 May 2025.
cite-note-21. "elixir/LICENSE at master Β· elixir-lang/elixir Β· GitHub". GitHub.
cite-note-0-33. β "Most Popular Programming Languages of 2018 - Elite Infoworld Blog". 2018-03-30. Archived from the original on 2018-05-09. Retrieved 2018-05-08.
cite-note-44. β "Elixir". JosΓ© Valim. Retrieved 2013-02-17.
cite-note-55. β "ElixirConf". Retrieved 2018-07-11.
cite-note-66. β "ElixirConf". Retrieved 2018-07-11.
cite-note-77. β "Erlang & Elixir Fest". Retrieved 2019-02-18.
cite-note-88. β "Elixir LDN". Retrieved 2018-07-12.
cite-note-99. β "EMPEX - Empire State Elixir Conference". Retrieved 2018-07-12.
cite-note-1010. β Elixir - A modern approach to programming for the Erlang VM. Retrieved 2013-02-17.
cite-note-1111. β JosΓ© Valim - ElixirConf EU 2017 Keynote. Archived from the original on 2021-11-17. Retrieved 2017-07-14.
cite-note-1212. β "Behinde the code: The One Who Created Elixir". Retrieved 2019-11-25.
cite-note-1414. β Elixir is a dynamic, functional language designed for building scalable and maintainable applications: elixir-lang/elixir, Elixir, 2019-04-21, retrieved 2019-04-21
cite-note-elixirhome-1515. β "Elixir". Retrieved 2014-09-07.
cite-note-1616. β "Writing assertive code with Elixir". 24 September 2014. Retrieved 2018-07-05.
cite-note-1717. β citerefloder2015Loder, Wolfgang (12 May 2015). Erlang and Elixir for Imperative Programmers. "Chapter 16: Code Structuring Concepts", section title "Actor Model": Leanpub. Retrieved 7 July 2015.{{cite book}}: CS1 maint: location (link)
cite-note-1818. β citerefwlaschin2013Wlaschin, Scott (May 2013). "Railway Oriented Programming". F# for Fun and Profit. Archived from the original on 30 January 2021. Retrieved 28 February 2021.
Further reading
β’ citerefsimon-st-laurentj-eisenberg2016Simon St. Laurent; J. Eisenberg (December 22, 2016). Introducing Elixir: Getting Started in Functional Programming 2nd Edition. O'Reilly Media. ISBN 978-1491956779.
β’ citerefsasa-juric2019Sasa Juric (January 12, 2019). Elixir in Action 2nd Edition. Manning Publications. ISBN 978-1617295027.